package com.ys.HashMap模拟实现;

/**
 * 描述:
 * * HashMap的经典面试题
 * * 1.当实例化HashMap时参数为15，那么请问实际创建HashMap对象是的数组空间长度为多少？？？
 * *   HashMap<String, Integer> hashMap = new HashMap<>(15);
 * *   答案：此处创建的table数组的空间长度为16。
 * * 2.为什么table数组的空间长度永远为2整数次幂？？？
 * *   a)table数组的空间长度为2整数次幂，则意味着我们可以使用“&”位运算。
 * *      当table数组的空间长度为2整数次幂，那么“哈希值 % 数组空间长度”和“哈希值 & (数组空间长度 - 1)”的结果一模一样
 * *          --> “&”位运算的效率肯定高于“%”运算
 * *   b)table数组的空间长度为2整数次幂，那么散列会更加均匀。
 * *      当table数组的空间长度为2整数次幂，那么“数组空间长度-1”的二进制值全部为1，那么“数组空间长度-1”的最低位也为1，那么肯定是一个奇数。
 * *          我们通过“hashCode()”方法获得的哈希值，有可能是奇数也有可能为偶数，那么“哈希值 & (数组空间长度-1)”的结果有奇数，也有偶数。
 * *      当table数组的空间长度不是2整数次幂，那么“数组空间长度-1”的二进制值可能为0，也可能为1，则意味“数组空间长度-1”的最低位也有可能为0。
 * *          我们通过“hashCode()”方法获得的哈希值，有可能是奇数也有可能为偶数，当“数组空间长度-1”的最低位为0的时候，那么“哈希值 & (数组空间长度-1)”的结果肯定为偶数。
 *
 * @author CodeYang
 * @version 2020/12/27 19:00
 */
public class HashMap经典面试题 {
    public static void main(String[] args) {
        // 只有2得整数次幂我们得到得 x. hashcode() & (2^幂-1)   与 x . hashcode() % (2^幂)   是一样得值

            System.out.println("123".hashCode()%8); //2
            System.out.println("123".hashCode()&(8-1)); //2


    }
}
